草庐IT

c++ - C++中static的含义

全部标签

c++ - "static initialization order fiasco"是 constexpr 变量的关注点吗?

如果我在一个翻译单元中用非默认值初始化一个constexpr变量foo然后初始化另一个constexpr变量bar和foo在另一个翻译单元中bar是否有可能在foo之前初始化导致bar由零或默认初始化的foo初始化。即,与非constexpr情况(静态初始化顺序惨败生效)不同,编译器和链接器会分析依赖顺序以保证正确的结果吗?此外,constexpr变量模板如何受到影响?它们的初始化顺序在单个翻译单元内未定义。首选C++17标准答案。更新:这是一个最小的例子。有用;那就是问题所在。在这一点上,我99%确定这是安全的TheStaticInitializationOrderFiasco(TS

c++ - 构造函数执行顺序/顺序 : dependent initialization of static variable (class instance) in a function

对于以下代码段:classBar{public:intx;inty;Bar(int_x,int_y){/*somecodeshere*/...}};classFoo{public:intx;inty;intz;Foo(Barb):x(b.x),y(b.y){z=someFunction(x,y);}};voidf(intx,inty){Barb(x,y);staticFoox(b);}intmain(){f(2,3);}在我看来,函数内的静态变量甚至应该在main()之前初始化。但是,Foo类型的静态变量x依赖于Bar类型的局部变量b。问题是:1)x的构造函数什么时候执行?即x是在第一

c++ - 'static void' 作为 decl-specifier

以下代码可以用clang编译。我想知道C++标准是否适合这个。classA{staticvoidx;//#1staticconstvoidx;//#2staticvolatilevoidx;//#3};在我看来,所有的声明都是无效的。perenialC++standardvalidationsuite有这样一个这样的测试(#1)和clang(v3.4)失败了。不过,如果我从#1中删除静态,则clang会按预期报告错误。我查看了标准,发现了一段关于静态数据成员(9.4.2-2)的内容:2Thedeclarationofastaticdatamemberinitsclassdefinitio

c++ - static constexpr char m_pszFoo[] = "***FOO***"有编译错误表达式没有计算常量

错误代码为C2131。即使我在其他文件中调用此变量的大小时,intelisense也不会提示,intelisense知道大小。我缺少什么才能使它正常工作?任何帮助是极大的赞赏。在下图中,可以看到智能感知没有提示并且还确定了大小。示例a.h:classa{private:staticconstexprcharm_pszFoo[]="***FOO***";//compileerroronthislineC2131expressiondidnotevaluatetoaconstantpublic:a(){sizeof(m_pszFoo);};//nocompileerrorhere};要重现

c++ - 当 static_cast'ing 为仅移动类型时,Clang 与 GCC

考虑以下简单的仅移动类:structbar{constexprbar()=default;bar(barconst&)=delete;bar(bar&&)=default;bar&operator=(barconst&)=delete;bar&operator=(bar&&)=default;};现在,让我们创建一个包装器:templatestructbox{constexprbox(T&&x):_payload{std::move(x)}{}constexprexplicitoperatorT()&&{returnstd::move(_payload);}private:T_payl

c++ - 有没有办法把 "inline"关键字的两种含义分开(ODR relaxation vs. function code inlining)

我想我完全理解C++中inline关键字的含义。具体来说,它意味着两个半相关的事情:对于声明为inline的函数放宽了ODR规则。因此,您可以在多个TU中定义相同的功能符号,而不会在链接它们时出现错误。这允许在header中定义函数。这是对编译器的一个建议,它应该用函数编译代码的拷贝替换函数的调用,而不是对地址的调用指令函数符号。我可以理解这两个含义在一个方向上必然相关:2必须暗示1。#2要求函数定义对所有调用该函数的TU可用。因此函数定义必须存在于多个TU中。因此需要放宽ODR以避免链接器错误。但我的问题是关于另一个方向-为什么语言设计为1必须暗示2?在某些情况下和对于某些设计决策,

c++ - GDB 错误 "cp_search_static_and_baseclasses"

我正在使用STM32Workbench(基于Eclipse的IDE),我有一个工作区,其中包含几个C++静态库和2个C++应用程序,所有这些都是使用STM32F4MCUC++应用程序或静态库模板制作的。我的第一个申请很顺利,我开始了第二个申请。该项目模板添加了一个带有无限循环的main.c,与语言无关。如果我尝试调试main.c一切正常,但如果我将文件名更改为main.cpp(我需要它以在内部使用C++类)GDB在调试前停止并出现错误:/home/build/work/GCC-5-0-build/src/gdb/gdb/cp-namespace.c:343:internal-error

c++ - (void (*)(void *))的含义

你能解释一下下面表达式中(void(*)(void*))的含义吗:(void(*)(void*))pthread_mutex_unlock 最佳答案 外括号代表Actor阵容。这些括号内的内容是要转换为的类型。在本例中,它是一个指向函数的指针(*),采取void*参数,并返回void(即什么都没有)。这里用来投pthread_mutex_unlock,有签名intpthread_mutex_unlock(pthread_mutex_t*);这样它就可以用于(例如,作为回调)需要类型函数的东西voidfunction(void*);请

c++ - 使用 static、const、constexpr 的全局声明/初始化

在C++或C++11中,对于以下声明//初始化,//globalscopeconstinta=1;//line1staticconstintb=2;//line2constexprintc=3;//line3staticconstexprintd=4;//line4constexprinte=a+b+c*d;//line5staticconstexprintf=a-b-c*d;//line6Thisquestion表示在文件范围内,C++中的第1行和第2行没有区别。3号线和4号线呢?第4行和第5行有区别吗?第5行和第6行有区别吗? 最佳答案

c++ - "no base classes of the same type as the first non-static data member"

我askedthisawhileago在comp.std.c++上并没有得到答复。我只是要在那里引用我的帖子,稍作修改。标准布局类的最后一个要求9/6是必要的还是有用的?提供了脚注解释:Thisensuresthattwosubobjectsthathavethesameclasstypeandthatbelongtothesamemost-derivedobjectarenotallocatedatthesameaddress(5.10).单独来看,脚注是不正确的。两个空基类公共(public)基类可能会产生基类的两个实例同一个地址。structA{};structB:A{};str